package com.le.tester.imooc.masterJUC.threadpool;

import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 描述：一个任务开启一个线程
 */
public class EveryTaskOneThread {
    public static void main(String[] args) {
        /**
         * 线程池希望的是更少的线程数量，即使队列中阻塞了很多
         * 判断的顺序是
         * corePoolSize,workQueue(BlockingQueue),maxPoolSize
         * 1.如果一个线程数小于corePoolSize,即使其他线程处于空闲的状态，也会创建线程。
         * 2.如果线程数等于或者大于corePoolSize但是小于maxPoolSize，任务还没有处理完，就会暂时的放进阻塞队列中
         * 3.如果队列处于满阻塞的状态了，任务还没有处理完已经分配的任务，并且此时的线程数目小于maxPoolSize，
         * 就会继续的创建新的线程，最大值是maxPoolSize.
         * 4.如果已经达到最大的线程数了，阻塞队列也已经是满的，但是还有任务要进来阻塞队列，那么就会启动这个拒绝的策略
         *
         * corePoolSize：核心的线程数目，有任务来了，就由这几个线程去处理，数目就是这几个线程数
         * 同时这几个核心的线程数目也是会一直存活的。小于corePoolSize,就创建小于corePoolSize的线程数
         * maxPoolSize：最大的线程数目。核心线程的数目不足以处理这么多的任务，
         * 就需要更多的线程，那么这个线程的上限数就是最大的线程数。
         * BlockingQueue：阻塞的队列，有任务过来，核心的线程能够处理呢，就暂时的放在这个阻塞的队列中。
         * （5个线程在处理任务，队列中也阻塞了五个，那么核心线程是可以处理的，那么就不会再额外的增加线程数）
         * 如果任务过多了，阻塞队列满了，还有任务，那么就会增加线程数，最大就是maxPoolSize;
         * keepAliveTime：当前的线程池的线程多于corePoolSize,这些多出来的线程，经过keepAliveTime后,就会终止
         */

       //new ThreadPoolExecutor(10,100,10, TimeUnit.SECONDS,);
        //给定任务的构造器
        Thread thread = new Thread(new Task());
        thread.start();
    }

    static class Task implements Runnable {

        @Override
        public void run() {
            System.out.println("执行了任务");
        }
    }
}
